#include "uart.h"
#include "ddl.h"
#include "gpio.h"

#include <stdio.h>
#include <stdarg.h>

#include "uart_api.h"

// uint8_t UT0_IDLE_FLAG = 0;
uint8_t UT0_RX_COUNT = 0;
unsigned char UT0_RX_BUF[UT0_RX_MAX_LEN];
// unsigned char UT0_TX_BUF[UT0_TX_MAX_LEN];
uint16_t UT0_RX_STA;   						//接收数据状态

volatile static uint8_t u8Rx1Data;
volatile static uint8_t u8Rx0Data;
// volatile static uint8_t u8TxCnt=0;
// volatile static uint8_t u8Tx0Cnt=0;
// volatile static uint8_t u8RxCnt=0;


// #define __DEBUG__

void UT0_RX_Clr(void)
{
    memset(UT0_RX_BUF, 0, UT0_RX_MAX_LEN);
    UT0_RX_COUNT = 0;
}

//UART1中断函数
void Uart1_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART1, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART1, UartRC);        //清中断状态位
        u8Rx1Data = Uart_ReceiveData(M0P_UART1);   //接收数据字节
		
		//调试转发给CAT1 用于AT指令
		Uart_SendDataIt(M0P_UART0, u8Rx1Data);
		
//        u8RxCnt++;
//		Uart_SendDataIt(M0P_UART1, u8RxCnt);
		
    }

    if(Uart_GetStatus(M0P_UART1, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(M0P_UART1, UartTC);        //清中断状态位
    }
}

//UART0中断函数
void Uart0_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART0, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART0, UartRC);        //清中断状态位
        u8Rx0Data = Uart_ReceiveData(M0P_UART0);   //接收数据字节
		
#ifdef __DEBUG__
		//收到回复转发到调试串口
		Uart_SendDataIt(M0P_UART1, u8Rx0Data);
#endif
		if(UT0_RX_COUNT < UT0_RX_MAX_LEN)
        {
            UT0_RX_BUF[UT0_RX_COUNT++] = u8Rx0Data;
        }
		
    }

    if(Uart_GetStatus(M0P_UART0, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(M0P_UART0, UartTC);        //清中断状态位
		
    }
}

//串口0与Cat.1模组通信
void uart0_init(uint32_t baudRate)
{
    if (baudRate < 1200 || baudRate > 115200) //波特率范围检查
    {
        baudRate = 115200; //默认波特率
    }
    
	stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin9, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin9, GpioAf1);          //配置PA9 端口为URART0_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA, GpioPin10, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin10, GpioAf1);         //配置PA10 端口为URART0_RX
	
	
	stc_uart_cfg_t stcCfg;

    DDL_ZERO_STRUCT(stcCfg);

    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart1模块时钟

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode1;          ///<模式1
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskDataOrAddr;           ///<无检验
    stcCfg.stcBaud.u32Baud  = baudRate;                  ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟（PCLK）频率值
    Uart_Init(M0P_UART0, &stcCfg);                   ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART0,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART0,UartTC);                ///<清发送请求
    Uart_EnableIrq(M0P_UART0,UartRxIrq);             ///<使能串口接收中断
    Uart_EnableIrq(M0P_UART0,UartTxIrq);             ///<使能串口发送中断
    EnableNvic(UART0_IRQn, IrqLevel3, TRUE);         ///<系统中断使能
}

//所有串口反初始化
void uart_deinit()
{
    ///<UART中断禁止
	EnableNvic(UART0_IRQn, IrqLevel3, FALSE);///<禁止UART0中断
	EnableNvic(UART1_IRQn, IrqLevel2, FALSE);///<禁止UART1中断                        

    ///<UART模块关闭
    Uart_DisableFunc(M0P_UART0, UartRenFunc);                         ///<关闭UART0模块
    Uart_DisableFunc(M0P_UART1, UartRenFunc);                         ///<关闭UART1模块

    ///<GPIO端口复位
    Gpio_SetAnalogMode(GpioPortA, GpioPin9);               ///<复位PA9端口
    Gpio_SetAnalogMode(GpioPortA, GpioPin10);              ///<复位PA10端口
    Gpio_SetAnalogMode(GpioPortA, GpioPin2);               ///<复位PA2端口
    Gpio_SetAnalogMode(GpioPortA, GpioPin3);               ///<复位PA3端口
}

//HC32L130 debug 输出
void uart1_init(uint32_t baudRate)
{
    if (baudRate < 1200 || baudRate > 115200) //波特率范围检查
    {
        baudRate = 115200; //默认波特率
    }
    
	stc_gpio_cfg_t stcGpioCfg;

    DDL_ZERO_STRUCT(stcGpioCfg);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟

    ///<TX
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1);          //配置PA2 端口为URART1_TX

    ///<RX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortA, GpioPin3, &stcGpioCfg);
    Gpio_SetAfMode(GpioPortA, GpioPin3, GpioAf1);         //配置PA3 端口为URART1_RX
	
	
	stc_uart_cfg_t stcCfg;

    DDL_ZERO_STRUCT(stcCfg);

    ///< 开启外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode1;          ///<模式1
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskDataOrAddr;           ///<偶检验
    stcCfg.stcBaud.u32Baud  = baudRate;                  ///<波特率115200
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟（PCLK）频率值
    Uart_Init(M0P_UART1, &stcCfg);                   ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART1,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART1,UartTC);                ///<清接收请求
    Uart_EnableIrq(M0P_UART1,UartRxIrq);             ///<使能串口接收中断
    Uart_EnableIrq(M0P_UART1,UartTxIrq);             ///<使能串口接收中断
    EnableNvic(UART1_IRQn, IrqLevel2, TRUE);       ///<系统中断使能
}

/**
 ******************************************************************************
 ** \brief  UART0发送一坨
 **
 ** \param [in] *buf需要发送的buf, len 长度
 **
 ** \retval 无
 **
 ******************************************************************************/
void UT0_write_buf(uint8_t *buf, uint8_t len)
{
    uint8_t i;
    if (len == 0) {
        return;
    }
    for (i = 0; i < len; i ++) {
        Uart_SendDataIt(M0P_UART0,*(buf + i));
    }
}

//发送字符串
void UT0_write_string(char * String)
{
    uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)//遍历字符数组（字符串），遇到字符串结束标志位后停止
	{
		Uart_SendDataIt(M0P_UART0, String[i]);		//依次调用SendByte发送每个字节数据
	}
}

/**
 ******************************************************************************
 ** \brief  UART1发送一坨
 **
 ** \param [in] *buf需要发送的buf, len 长度
 **
 ** \retval 无
 **
 ******************************************************************************/
void UT1_write_buf(uint8_t *buf, uint8_t len)
{
    uint8_t i;
    if (len == 0) {
        return;
    }
    for (i = 0; i < len; i ++) {
        Uart_SendDataIt(M0P_UART1,*(buf + i));
    }
}

//发送字符串
void UT1_write_string(char * String)
{
    uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)//遍历字符数组（字符串），遇到字符串结束标志位后停止
	{
		Uart_SendDataIt(M0P_UART1, String[i]);		//依次调用SendByte发送每个字节数据
	}
}

//发送一个字节
void Uart_SendByte(M0P_UART_TypeDef* UARTx,uint8_t ch)
{
	Uart_SendDataIt(UARTx, ch);//库函数的发送一个字节
	while( Uart_GetStatus(UARTx, UartTxe)== FALSE);
    //获取TXE的状态，一直等于FLASE=0，表示TX buffer非空
}

//发送字符串
void Uart_SendString(M0P_UART_TypeDef* UARTx,char *str)
{
	uint8_t k=0;
	do
	{
//		if(Uart_GetStatus(M0P_UART0,UartTC))
//		{
//			Uart_ClrStatus(M0P_UART0, UartTC);
//		}
		Uart_SendByte(UARTx,*(str+k));//循环发送一个字节一个字节的发
		k++;
	}while(*(str+k)!='\0');//直至遇到字符串结束符 '\0'
	
}

/**
  * 函    数：自己封装的prinf函数
  * 参    数：format 格式化字符串
  * 参    数：... 可变的参数列表
  * 返 回 值：无
  */
void Debug_Printf(char *format, ...)
{
	char String[256];				//定义字符数组
	va_list arg;					//定义可变参数列表数据类型的变量arg
	va_start(arg, format);			//从format开始，接收参数列表到arg变量
	vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中
	va_end(arg);					//结束变量arg
	Uart_SendString(M0P_UART1, String);		//串口发送字符数组（字符串）
}


